题意简述
$n$ 行 $n$ 列的矩阵上,只有 $m$ 个“关键点”处(在第 $x$ 行 $y$ 列)才能拐弯。从格子到上下左右四个相邻格子花费 $2$,转弯花费 $1$。 求从某个位置走到另一个位置的最小花费。无解输出 $-1$。
思路
新建两个点 $S$ 和 $T$ 表示起点。 然后把所有点 $A$(包括关键点和 $S,T$) 拆成两个点 $A_1$ 和 $A_2$,分别表示横向跑和纵向跑。
对于所有关键点 $K$ (不包括 $S,T$),$K_1$ 到 $K_2$ 连一条边权为 $1$ 的无向边,表示换乘。
然后对于所有同一行 ($x$ 相同)的点,按照列号 $y$ 排序。对于相邻的 $A,B$,连边 $(A_1,B_1,2\times dis)$,其中 $dis$ 为 $A,B$ 两点 $y$ 值的距离。为啥乘二,是因为相邻格子要花费 $2$。 同一列同理(同一列连的是 $A_2$ 和 $B_2$)。
然后我们从 $S_1$ 跑到 $T_1,T_2$,从 $S_2$ 跑到 $T_1,T_2$ ,四种方案,看哪个最小。如果都不能到达…那就输出 $-1$。
代码
1 |
|